/**
 * 观察数组，包装方法
 * https://www.jianshu.com/p/8c10640033c3
 * 摘改自vue源码 https://github.com/ysj16/vue-lite/blob/master/src/2.%E4%BE%9D%E8%B5%96%E6%94%B6%E9%9B%86(2)/vue.js#L71
 * @param {*} arr 被包装的数组
 * @param {*} packageMethods 要被包装的方法
 * @param {*} host 包装方法的指向
 */
const initArrayMethod = function(arr, packageMethods, host) {
    var arrayProto = arr.__proto__
    // 复制原生数组原型上的方法，并替换掉
    var arrayMethods = Object.create(arrayProto);
    Object.keys(packageMethods).forEach(function(method) {
        var origin = arrayMethods[method]
        arrayMethods[method] = function() {
            // 保存原生数组调用的结果
            var result = origin.apply(this, arguments)
            // 这里就是调用被观测的属性上的dep（__ob__）
            // this.__ob__.dep.notify()
            packageMethods[method].call(host, arguments, this)
            return result
        }
    })
    arr.__proto__ = arrayMethods
}

export default initArrayMethod